package com.tydic.trans.controller;

import com.tydic.trans.service.TransactionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("trans")
public class TransactionController {
    @Autowired
    private TransactionService transactionService;

    @GetMapping("demo01")
    public String demo1() {
        try {
            transactionService.demo1();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试1：不加@Transactional，事务不会回滚";
    }

    @GetMapping("demo02")
    public String demo2() {
        try {
            transactionService.demo2();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试2：加上@Transactional，事务会回滚";
    }

    @GetMapping("demo03")
    public String demo3() {
        try {
            transactionService.demo3();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试3：捕捉了异常不会回滚";
    }

    @GetMapping("demo04")
    public String demo4() {
        try {
            transactionService.demo4();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试4：捕捉了异常后，在catch中主动抛出一个RuntimeException异常，会回滚";
    }

    @GetMapping("demo05")
    public String demo5() {
        try {
            transactionService.demo5();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试5：捕捉了异常后，在catch中主动抛出一个非RuntimeException异常，不会回滚" +
                "因为在java的设计中，它认为不继承RuntimeException的异常是”checkException”或普通异常，如IOException，" +
                "这些异常在java语法中是要求强制处理的。对于这些普通异常，spring默认它们都已经处理，所以默认不回滚";
    }

    @GetMapping("demo06")
    public String demo6() {
        try {
            transactionService.demo6();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试6：捕捉了异常后，在catch中主动抛出一个非RuntimeException异常，但是设置@Transactional" +
                "的rollbackfor=Exception.class来表示所有的Exception都回滚";
    }

    @GetMapping("demo07")
    public String demo7() {
        try {
            transactionService.demo7();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试7：不带事务的方法调用该类中带事务的方法，不会回滚。\n因为spring的回滚是用代理模式生成的，" +
                "如果是一个不带事务的方法调用该类的带事务的方法，直接通过this.xxx()调用，而不生成代理事务，所以事务不起作用";
    }

    @GetMapping("demo08")
    public String demo8() {
        try {
            transactionService.demo8();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试8：带事务的方法调用该类中不带事务的方法，会回滚。";
    }

    @GetMapping("demo09")
    public String demo9() {
        try {
            transactionService.demo9();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试9：带事务的方法调用该类中另一个会挂起事务并创建新事务的方法，不会回滚。\n（测试结果：会回滚）";
    }

    @GetMapping("demo10")
    public String demo10() {
        try {
            transactionService.demo10();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "测试10：不带事务的方法A调用该类中带事务的方法B，并在方法A中将this调用改成动态代理调用(AopContext.currentProxy())，会回滚\n" +
                "对比demo07。";
    }
}
